// performUnitOfWork用来执行任务，参数是我们的当前fiber任务，返回值是下一个任务
function performUnitOfWork(fiber) {
    // 根节点的dom就是container，如果没有这个属性，说明当前fiber不是根节点
    if(!fiber.dom) {
      fiber.dom = createDom(fiber);   // 创建一个DOM挂载上去
    } 
  
    // 如果有父节点，将当前节点挂载到父节点上
    if(fiber.return) {
      fiber.return.dom.appendChild(fiber.dom);
    }
  
    // 将我们前面的vDom结构转换为fiber结构
    const elements = fiber.children;
    let prevSibling = null;
    if(elements && elements.length) {
      for(let i = 0; i < elements.length; i++) {
        const element = elements[i];
        const newFiber = {
          type: element.type,
          props: element.props,
          return: fiber,
          dom: null
        }
  
        // 父级的child指向第一个子元素
        if(i === 0) {
          fiber.child = newFiber;
        } else {
          // 每个子元素拥有指向下一个子元素的指针
          prevSibling.sibling = newFiber;
        }
  
        prevSibling = newFiber;
      }
    }
  
    // 这个函数的返回值是下一个任务，这其实是一个深度优先遍历
    // 先找子元素，没有子元素了就找兄弟元素
    // 兄弟元素也没有了就返回父元素
    // 然后再找这个父元素的兄弟元素
    // 最后到根节点结束
    // 这个遍历的顺序其实就是从上到下，从左到右
    if(fiber.child) {
      return fiber.child;
    }
  
    let nextFiber = fiber;
    while(nextFiber) {
      if(nextFiber.sibling) {
        return nextFiber.sibling;
      }
  
      nextFiber = nextFiber.return;
    }
  }
//   ————————————————
//   版权声明：本文为CSDN博主「_蒋鹏飞」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
//   原文链接：https://blog.csdn.net/dennis_jiang/article/details/106928259